﻿using System;

namespace Testy
{
    class Program
    {
        static void Main( string[] args )
        {
            Console.WriteLine( "== Tworzenie nowego drzewa." );
            Tree tree = new Tree( 112 );
            Console.WriteLine("== Proba pobrania pierwszego potomka, ktory nie istnieje.");
            int firstElement;
            Console.WriteLine("== Czy drzewo zawiera dzieci : {0}, wartosc : {1}", tree.GetFirstChild(out firstElement), firstElement);
            Console.WriteLine( "== Dodawanie poddrzew." );
            tree.AddChild( 144 );
            tree.AddChild( 132 );
            tree.AddChild( 154 );
            tree.AddChild( 132 );
            Console.WriteLine( "== Wartosc zawarta w drzewie = {0}", tree.Data );
            Console.WriteLine( "== Przechodzenie pętlą po wszystkich potomkach drzewa" );
            for ( int i = 0; i < tree.ChildCount; i++ )
            {
                Console.WriteLine( "== Wartosc potomka nr {0} = {1}", i, tree[i].Data );
            }

            Console.WriteLine( "== Tworzenie drugiego drzewa - superdrzewa" );
            SuperTree tree2 = new SuperTree( 212 );
            Console.WriteLine( "== Podlaczanie event handlera dla dodawania nowego podrzewa" );
            tree2.AddedChild += new AddedChildEventHandler( tree2_AddedChild );
            Console.WriteLine( "== Dodawanie poddrzew." );
            tree2.AddChild( 244 );
            tree2.AddChild( 232 );
            tree2.AddChild( 254 );
            tree2.AddChild( 232 );

            Console.WriteLine("== Utworzenie sumy drzew");
            Tree treeSum = tree + tree2;

            Console.WriteLine( "== Proba pobrania pierwszego potomka, ktory istnieje." );
            Console.WriteLine( "== Czy drzewo zawiera dzieci : {0}, wartosc : {1}", tree.GetFirstChild( out firstElement ), firstElement );

            Console.WriteLine( "== Przejście po wszystkich elementach drzewa za pomocą wizytatora" );
            TreeVisitor visitor = ( int nodeData ) => Console.WriteLine("== Wizytator odwiedza drzewo o wartosci {0}", nodeData);
            treeSum.Traverse( visitor );

            Console.WriteLine("== Dodanie wielu elementów za pomocą metody o nieokreślonej liczbie argumentów.");
            treeSum.AddChild( 311, 322, 333, 344 );

        }

        static void tree2_AddedChild( object sender, Tree child, int position )
        {
            Console.WriteLine( "== Dodano nowe drzewo - o wartosci {0} na pozycji {1} do drzewa o wartosci {2}",
                child.Data, position, ( (Tree)sender ).Data );
        }
    }
}
